/**
 * @Author: hogan
 * @Date: 2021/6/21
 * @General Documentation:
 **/
package main

import (
	"encoding/json"
	"fmt"
	"io/ioutil"
	"os"
	"runtime"
	"sync"
)

import (
	"cn.hogan/modetest/src/config"
	"cn.hogan/modetest/src/logger"
	"cn.hogan/modetest/src/spider"
	"cn.hogan/modetest/src/utils"
)


// 默认配置文件的地址
var (
	ROOT_ABS_PATH = utils.GetCurrentPath()
	SPIDER_CONFIG_FILE = ROOT_ABS_PATH + "/src/config/spider.conf" // 配置位置
	SPIDER_LOGGER_PATH = ROOT_ABS_PATH + "/logs"                   // 日志位置
)

// 初始化配置接收变量
var (
	wg         sync.WaitGroup // 定义一个wg
	InitConfig config.ReturnConfig
)

/**
 * @Description:帮助文档
 * @Param:opt 操作符
 * @Returns:nil
 **/
func printTops(opt string) {

	if opt == "-v" || opt == "--version" {
		fmt.Println("mini_spider version 1.0")
	} else if opt == "-l" {
		// 日志文件路径
		fmt.Println(SPIDER_LOGGER_PATH)
	} else if opt == "-c" {
		// 配置文件的路径
		fmt.Println(SPIDER_CONFIG_FILE)
	} else {
		// -h/help 或者其他操作符，直接输出完整提示菜单
		help := "-v check the version\n-h view the help documentation\n-c config file path\n-l log file path"
		fmt.Println(help)
	}

}

/**
 * @Description:初始项目前期启动项，包括全局日志，全局配置
 * @Param: nil
 * @Returns: nil
 **/
func init() {
	// 初始化全局日志
	logger.InitLogger(SPIDER_LOGGER_PATH)
	// 初始化配置文件
	InitConfig = config.InitConfig(SPIDER_CONFIG_FILE)
	if InitConfig.Err != nil {
		// 配置初始化错误，退出程序
		logger.Error("Configuration load error program exits")
		os.Exit(0)
	}
	// 启动成功
	logger.Info("mini_spider running")
}

func main() {
	// 获取传入的参数
	args := os.Args
	argsLen := len(args) // 计算参数长度，参数默认有一个值
	if argsLen == 2 {
		printTops(args[1])
		utils.Exit() // 退出程序
	} else if argsLen != 2 && argsLen != 1 {
		printTops("")
		utils.Exit()
	}

	// 配置 runtime 数量
	if InitConfig.Config.ThreadCount <= runtime.NumCPU() && InitConfig.Config.ThreadCount > 0{
		runtime.GOMAXPROCS(InitConfig.Config.ThreadCount)
	}else {
		runtime.GOMAXPROCS(runtime.NumCPU())
	}



	// 爬取数据
	//urls := []string{"https://www.sina.com.cn/"}
	//urls := []string{"http://wmjywyh.cqyti.com/zyfw.htm"}
	//urls := []string{"http://wmjywyh.cqyti.com/zyfw.htm"}

	var urls []string
	b, err := ioutil.ReadFile(ROOT_ABS_PATH  + InitConfig.Config.UrlListFile)
	if err != nil {
		logger.Error(err)
		utils.Exit()
	}
	//json to []string
	if err := json.Unmarshal(b, &urls); err != nil {
		logger.Error(err)
		utils.Exit()
	}

	spider.Start(urls, InitConfig, &wg)
	println("exit ...")
	wg.Wait()
}
